/**
 * @(#)UsuarioK.java 26/08/06
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 26/08/06
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <br/>26/08/06 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.
 * <li>14/01/07 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Se quito del paquete com.psiqueware.tulipan.personas y se le asigno su propio paquete.</li>
 * <li>14/01/07 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Se eliminaron las referencias a {@link Persona} del paquete tulipan.usuarios y se le asigno una credencial a este usuario.</li>
 * <li>14/01/07 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Se le agrega una clave y un titulo para uso del framework que utilize este sistema.</li>
 */

package com.psiqueware.alheli.id.modelo;

import com.psiqueware.alheli.basico.BaseObject;
import com.psiqueware.alheli.id.Dominio;
import com.psiqueware.alheli.id.Identificacion;
import com.psiqueware.alheli.id.PerfilSocial;
import com.psiqueware.alheli.id.Usuario;
import com.psiqueware.alheli.seguridad.Credencial;
import com.psiqueware.alheli.seguridad.UsuarioSeguridad;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Usuario del sistema. Este objeto debe identificar cada persona logeado; dado que los
 * {@link Identificacion} para una sola persona pueden ser varios.
 * <p/>
 * <br/>Paquete Original: com.psiqueware.basico.id.modelo
 * <br/>Nombre  Original: UsuarioK
 * <br/><a href="UsuarioK.java.html"><i>Ver C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@psiqueware.com">Angel Electrico</a>
 * @version Revision: 1.0 26/08/06
 * @noinspection ClassWithoutLogger
 */
public final class UsuarioK extends BaseObject implements Usuario

{

    /**
     * Listado de {@link com.psiqueware.alheli.id.PerfilSocial}s que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     */
    private final List<PerfilSocial> m_perfiles = new ArrayList<PerfilSocial>();
    /**
     * Identificacion de este Usuario.
     */
    private String m_identificacion;
    /**
     * Clave identificador de este {@link Usuario}. Puede ser <code>null</code>. No se garantiza que sea unica.
     */
    private String m_clave;
    /**
     * Titulo visible en pantalla de este {@link Usuario}. Inicialmente es una cadena vacia. No se garantiza que sea unico.
     */
    private String m_titulo = "";
    /**
     * Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     */
    private Long m_idDominio;
    /**
     * Credencial de este {@link Usuario} utilizada para los modulos que tienen seguridad.
     */
    private Credencial m_credencial;

    /**
     * Construye una UsuarioK.
     * No requiere argumentos.
     */
    public UsuarioK()
    {

    }

    /**
     * Construye un UsuarioK.
     *
     * @param identificacion Identificacion de este Usuario.
     * @param clave          lave identificador de este {@link Usuario}. Puede ser <code>null</code>. No se garantiza que sea unica
     * @param titulo         Titulo visible en pantalla de este {@link Usuario}. Inicialmente es una cadena vacia. No se garantiza que sea unico.
     */
    public UsuarioK(final String identificacion, final String clave, final String titulo, final Dominio dominio)
    {
        m_identificacion = identificacion;
        m_clave = clave;
        m_titulo = titulo;
        m_idDominio = dominio == null ? null : dominio.getId();
    }

    /**
     * A&ntilde;ade un {@link com.psiqueware.alheli.id.PerfilSocial} al listado m_perfiles, que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     *
     * @param o {@link com.psiqueware.alheli.id.PerfilSocial} a añadir.
     *
     * @return <tt>true</tt> (as per the general contract of the
     * <tt>Collection.add</tt> method).
     */
    public boolean addPerfilSocial(final PerfilSocial o)
    {
        return m_perfiles.add(o);
    }

    /**
     * Remueve un {@link com.psiqueware.alheli.id.PerfilSocial} del listado <code>m_perfiles</code>, que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     *
     * @param o {@link com.psiqueware.alheli.id.PerfilSocial} a eliminar.
     *
     * @return <tt>true</tt> if this list contained the specified element.
     */
    public boolean removePerfilSocial(final PerfilSocial o)
    {
        return m_perfiles.remove(o);
    }

    /**
     * Devuelve una copia del listado <code>m_perfiles</code>, que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     *
     * @return una nueva List&lt;PerfilSocial&gt;.
     */
    public List<PerfilSocial> listPerfiles()
    {
        return new ArrayList<PerfilSocial>(m_perfiles);
    }

    /**
     * Devuelve la Lista de los {@link com.psiqueware.alheli.id.PerfilSocial} que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     *
     * @return List(unmodifiable) de 'm_perfiles'.
     *
     * @see java.util.List
     */
    public List<PerfilSocial> getPerfiles()
    {
        return Collections.unmodifiableList(m_perfiles);
    }

    /**
     * Establece los valores de la Lista de los {@link com.psiqueware.alheli.id.PerfilSocial} que es el listao de los {@link com.psiqueware.alheli.id.PerfilSocial} asociados a este {@link com.psiqueware.alheli.id.Usuario}.
     *
     * @param newList nuevo valor para 'm_perfiles'. En caso de ser nulo se vaciar&aacute; el arreglo existente.
     *
     * @see java.util.List
     */
    public void setPerfiles(final List<? extends PerfilSocial> newList)
    {
        this.m_perfiles.clear();
        if (null != newList)
        {
            this.m_perfiles.addAll(newList);
        }
    }

    /**
     * Nos dice si el {@link com.psiqueware.alheli.id.PerfilSocial} se encuentra contenido en la
     * lista.
     *
     * @param o {@link com.psiqueware.alheli.id.PerfilSocial} a buscar.
     *
     * @return <code>true</code> si lo encuentra; <code>false</code> en caso contrario.
     */
    public boolean containsPerfilSocial(final PerfilSocial o)
    {
        return m_perfiles.contains(o);
    }

    /**
     * Devuelve el Identificacion de este Usuario.
     *
     * @return valor de 'login'.
     */
    public String getIdentificacion()
    {
        return m_identificacion;
    }

    /**
     * Establece el Identificacion de este Usuario.
     *
     * @param identificacion nuevo valor para 'identificacion'.
     */
    public void setIdentificacion(String identificacion)
    {
        m_identificacion = identificacion;
    }

    /**
     * Devuelve el Clave identificador de este {@link Usuario}.
     *
     * @return valor de 'clave'.
     */
    public String getClave()
    {
        return m_clave;
    }

    /**
     * Establece el Clave identificador de este {@link Usuario}.
     *
     * @param clave nuevo valor para 'clave'.
     */
    public void setClave(final String clave)
    {
        m_clave = clave;
    }

    /**
     * Devuelve el Titulo visible en pantalla de este {@link Usuario}. Inicialmente es una cadena vacia. No se garantiza que sea unico.
     *
     * @return valor de 'titulo'.
     */
    public String getTitulo()
    {
        return m_titulo;
    }

    /**
     * Establece el Titulo visible en pantalla de este {@link Usuario}. Inicialmente es una cadena vacia. No se garantiza que sea unico.
     *
     * @param titulo nuevo valor para 'titulo'.
     */
    public void setTitulo(final String titulo)
    {
        m_titulo = titulo;
    }

    /**
     * Devuelve la {@link Credencial} del {@link UsuarioSeguridad}.
     *
     * @return Credencial de este {@link UsuarioSeguridad}.
     */
    public Credencial getCredencial()
    {
        return m_credencial;
    }

    /**
     * Asigna la {@link Credencial} del {@link UsuarioSeguridad}.
     *
     * @param credencial nueva.
     */
    public void setCredencial(Credencial credencial)
    {
        m_credencial = credencial;
    }

    /**
     * Devuelve el Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     *
     * @return valor de 'idDominio'.
     */
    public Long getIdDominio()
    {
        return m_idDominio;
    }

    /**
     * Establece el Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     *
     * @param idDominio nuevo valor para 'idDominio'.
     */
    public void setIdDominio(final Long idDominio)
    {
        m_idDominio = idDominio;
    }

    @Override
    public String toString()
    {
        return "UsuarioK{" +
               "m_identificacion='" + m_identificacion + '\'' +
               ", m_clave='" + m_clave + '\'' +
               ", m_titulo='" + m_titulo + '\'' +
               ", m_idDominio=" + m_idDominio +
               ", m_credencial=" + m_credencial +
               "} " + super.toString();
    }

    @Override
    public boolean equals(final Object o)
    {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;

        final UsuarioK usuarioK = (UsuarioK) o;

        if (m_id != null && m_id.equals(usuarioK.m_id)) return true;
        if (m_clave != null ? !m_clave.equals(usuarioK.m_clave) : usuarioK.m_clave != null) return false;
        if (m_credencial != null ? !m_credencial.equals(usuarioK.m_credencial) : usuarioK.m_credencial != null)
            return false;
        if (m_idDominio != null ? !m_idDominio.equals(usuarioK.m_idDominio) : usuarioK.m_idDominio != null)
            return false;
        if (m_identificacion != null ? !m_identificacion.equals(usuarioK.m_identificacion) : usuarioK.m_identificacion != null)
            return false;
        if (m_titulo != null ? !m_titulo.equals(usuarioK.m_titulo) : usuarioK.m_titulo != null) return false;

        return true;
    }

    @Override
    public int hashCode()
    {
        int result = super.hashCode();
        result = 31 * result + (m_identificacion != null ? m_identificacion.hashCode() : 0);
        result = 31 * result + (m_clave != null ? m_clave.hashCode() : 0);
        result = 31 * result + (m_titulo != null ? m_titulo.hashCode() : 0);
        result = 31 * result + (m_idDominio != null ? m_idDominio.hashCode() : 0);
        result = 31 * result + (m_credencial != null ? m_credencial.hashCode() : 0);
        return result;
    }
}
